home *** CD-ROM | disk | FTP | other *** search
/ Pascal Super Library / Pascal Super Library (CW International)(1997).bin / OVERLAY / OVREX / OVREXAMP.PAS
Pascal/Delphi Source File  |  1990-12-23  |  2KB  |  90 lines

  1. { Writtem by Marc Perkel * From Directory Master III
  2.  
  3. This is a piece of one of my programs that demonstrates how to move
  4. the overlay buffer to high memory. This allows it to be released so that
  5. when you EXEC a program, you have the maximum space available for dos.
  6.  
  7. This code example is public domian}
  8.  
  9.  
  10. Unit DM33;
  11.  
  12. {DM3 Init Code}
  13.  
  14. Interface
  15.  
  16. Procedure ExecDos3 (var Cmd,Tail : String);
  17.  
  18. Implementation
  19.  
  20. uses
  21.    Overlay,
  22.    Dos;
  23.  
  24. Var OvrName : String[80];
  25.  
  26. Procedure SetBlock (var Paragraphs : Word);
  27.   {-Change size of DOS memory block allocated to this program}
  28. var
  29.   Regs : Registers;
  30. begin
  31.   with Regs do begin
  32.     AH := $4A;
  33.     ES := PrefixSeg;
  34.     BX := Paragraphs;
  35.     MsDos(Regs);
  36.     Paragraphs := BX;
  37.   end;
  38. end;
  39.  
  40. Procedure OpenOvr;
  41. {This moves all the variables to put the overlay buffer on top end of ram}
  42. begin
  43.    {Allocates 4800 paragraphs at end of ram}
  44.    OvrClearBuf;
  45.    OvrHeapOrg := PrefixSeg + MemW[pred(PrefixSeg):3] - 4800;
  46.    OvrHeapPtr := OvrHeapOrg;
  47.    OvrHeapEnd := OvrHeapOrg + 4800;
  48.    HeapEnd := Ptr(OvrHeapOrg,0);
  49.    OvrSetRetry(20000);
  50. end;
  51.  
  52. Procedure ExecDos3 (var PathName, CommandTail : string);
  53.   var
  54.     ParasToKeep,
  55.     ParasWeHave : Word;
  56.   begin
  57.  
  58.     OvrClearBuf;
  59.  
  60.     {Current DOS memory allocation read from memory control block}
  61.     ParasWeHave := MemW[Pred(PrefixSeg):3];
  62.  
  63.     ParasToKeep := succ(seg(HeapPtr^) - PreFixSeg);
  64.  
  65.     {Deallocate memory for DOS}
  66.     SetBlock(ParasToKeep);
  67.  
  68.     SwapVectors;
  69.     Exec(PathName, CommandTail);
  70.     SwapVectors;
  71.  
  72.     {Reallocate memory from DOS}
  73.     SetBlock(ParasWeHave);
  74.     OpenOvr;
  75.   end;
  76.  
  77. begin
  78.    {Move the heap down where the overlay buffer was}
  79.    HeapOrg := Ptr(OvrHeapOrg,0);
  80.    HeapPtr := HeapOrg;
  81.    FreeList := HeapPtr;
  82.    OpenOvr;
  83.    OvrFileMode := $A0;      {Read Sharable for Networks}
  84.    OvrName := ParamStr(0);
  85.    dec(OvrName[0],3);
  86.    OvrName := FExpand(OvrName + 'OVR');
  87.    OvrInit(OvrName);
  88. end.
  89.  
  90.